package com.example.mybatisplusdemo.model.dto;

import lombok.Data;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
        * 航班价格比较数据传输对象
 * 用于展示同一航班在不同供应商的价格和优惠信息
 */
@Data
public class PriceComparisonDTO {

    /**
            * 供应商ID
     */
    private Long supplierId;

    /**
            * 供应商名称
     */
    private String supplierName;

    /**
            * 供应商Logo URL
     */
    private String supplierLogo;

    /**
            * 基础票价
     */
    private BigDecimal basePrice;

    /**
            * 机场建设费
     */
    private BigDecimal airportTax;

    /**
            * 燃油附加费
     */
    private BigDecimal fuelSurcharge;

    /**
            * 总价（基础票价+税费）
            */
    private BigDecimal totalPrice;

    /**
            * 是否支持VIP折扣
     */
    private Boolean vipDiscountAvailable;

    /**
            * 当前用户的VIP折扣率
     */
    private BigDecimal vipDiscountRate;

    /**
            * 可用优惠券ID列表
     */
    private List<Long> couponIds;

    /**
            * 最大优惠金额
     */
    private BigDecimal maxDiscountAmount;

    /**
            * 优惠活动列表
     */
    private List<PromotionDTO> promotions;

    /**
            * 退改政策信息
     */
    private RefundPolicyDTO refundPolicy;

    /**
            * 是否支持积分抵扣
     */
    private Boolean pointsDeductible;

    /**
            * 每元可抵扣积分
     */
    private Integer pointsPerYuan;

    /**
            * 用户评价得分 (0-5)
     */
    private Double userRating;

    /**
            * 用户评价数量
     */
    private Integer ratingCount;

    /**
            * 平均出票时间（分钟）
            */
    private Integer averageIssueTime;

    /**
            * 预订按钮URL
     */
    private String bookingUrl;

    /**
            * 预订后跟踪ID（用于平台跟踪）
            */
    private String trackingId;

    /**
            * 供应商特殊备注
     */
    private String specialNotes;

    /**
            * 最后更新时间
     */
    private Date lastUpdated;

    /**
            * 优惠活动数据传输对象
     */
    @Data
    public static class PromotionDTO {
        private String type; // "满减"/"折扣"/"立减"
        private String name; // 活动名称
        private String code; // 优惠码（如果有）
        private String description; // 活动描述

        // 折扣类型特有
        private BigDecimal discountRate; // 折扣率

        // 满减/立减类型特有
        private BigDecimal threshold; // 满减门槛
        private BigDecimal discountAmount; // 优惠金额

        // 时间范围
        private Date startTime;
        private Date endTime;
    }

    /**
            * 退改政策数据传输对象
     */
    @Data
    public static class RefundPolicyDTO {
        private BigDecimal refundFee; // 退票费用
        private BigDecimal changeFee; // 改签费用

        // 不同时间段的费用
        private BigDecimal before24HoursFee;
        private BigDecimal before6HoursFee;
        private BigDecimal afterDepartureFee;

        // 特殊说明
        private Boolean noShowRefundable; // 是否支持No Show退票
        private Boolean freeChanges; // 是否支持免费改签

        // 文字描述
        private String shortDescription; // 简短描述
        private String detailUrl; // 详情页面URL
    }

    /**
            * 计算折扣后价格
     */
    public BigDecimal getDiscountedPrice(BigDecimal maxDiscount) {
        BigDecimal discounted = totalPrice;

        if (maxDiscount != null && maxDiscount.compareTo(BigDecimal.ZERO) > 0) {
            if (maxDiscount.compareTo(totalPrice) > 0) {
                discounted = BigDecimal.ZERO;
            } else {
                discounted = totalPrice.subtract(maxDiscount);
            }
        }

        // 应用VIP折扣
        if (vipDiscountAvailable && vipDiscountRate != null) {
            discounted = discounted.multiply(BigDecimal.ONE.subtract(vipDiscountRate));
        }

        return discounted.setScale(2, BigDecimal.ROUND_HALF_UP);
    }
}